package com.justme.shipdfer.service;

import com.justme.shipdfer.bean.param.PdfBody;
import com.justme.shipdfer.core.TemplateFactory;
import com.openhtmltopdf.outputdevice.helper.AddedFont;
import com.openhtmltopdf.outputdevice.helper.BaseRendererBuilder;
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import org.beetl.core.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author shiv
 * @create 2021/4/11 5:21 下午
 */
@Service
public class PdferService {

    @Value("${pdfer.fonts}")
    private Resource[] fonts;

    private List<AddedFont> addedFontList;

    @Autowired
    private TemplateFactory templateFactory;

    @PostConstruct
    public void init() {
        // 下面这个方法是要自己指定 字体文件   不然转出的pdf文件中 中文会变成####
        // 第二个参数 一定要和文件名一样！！作用在html页面上
        addedFontList = Arrays.stream(fonts).filter(font -> !StringUtils.isEmpty(font.getFilename()))
                .map(font -> {
                    int weight = Objects.requireNonNull(font.getFilename()).contains("bold") ? 700 : 400;
                    BaseRendererBuilder.FontStyle style = font.getFilename().contains("italic") ? BaseRendererBuilder.FontStyle.ITALIC : BaseRendererBuilder.FontStyle.NORMAL;

                    return new AddedFont(() -> {
                        try {
                            //指定 字体文件
                            return font.getInputStream();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return null;
                    }, null, weight,
                            font.getFilename().substring(0, font.getFilename().lastIndexOf(".")),
                            true, style,
                            EnumSet.of(BaseRendererBuilder.FSFontUseCase.DOCUMENT));

                }).collect(Collectors.toList());
    }


    public void generatePdf(PdfBody pdfBody, OutputStream outputStream, boolean preview) throws IOException {
        // 获取模板
        Template template = templateFactory.getTemplate(pdfBody.getTemplateKey(), null);

        String html = "";
        if (preview) {
            html = FileCopyUtils.copyToString(template.program.res.openReader());
        } else {
            // 绑定变量
            template.binding("_root", pdfBody.getVariables() == null ? Collections.emptyMap() : pdfBody.getVariables());
            // 渲染文本
            html = template.render();
        }

        // 构建pdf渲染
        PdfRendererBuilder builder = new PdfRendererBuilder();
        builder.useFastMode();

        // 配置字体
        addedFontList.forEach(font ->
                builder.useFont(font.supplier, font.family, font.weight, font.style, font.subset, font.usedFor));

        // 第一个参数是html页面  第二个参数 是一个全空的文件 里面什么都没有 但是后缀一定要是.htm
        // 作用类似于一个画板 如果不添加这个参数或者置为null 则html文件中的图片 不会转化 所以一定需要加
//            builder.withHtmlContent(html, Surrogate.Generator.class.getResource("/root.htm").toExternalForm());
        builder.withHtmlContent(html, null);
        builder.toStream(outputStream);
        builder.run();
    }
}
